PyTorch入門:テンソルの重要性とは
PyTorchは、ディープラーニング研究や迅速なプロトタイピングに最適な、非常に柔軟で動的なオープンソースフレームワークです。その中心にあるのがテンソルであり、深層学習モデルに必要な数値演算を効率的に処理できるように設計された多次元配列です。自動的にGPU加速をサポートしています。
1. テンソル構造の理解
PyTorchにおけるすべての入力、出力、およびモデルパラメータはテンソルにカプセル化されています。これらはNumPy配列と同じ役割を果たしますが、GPUといった専用ハードウェア上で処理されるように最適化されており、ニューラルネットワークに必要な大規模な線形代数演算においてははるかに効率的です。
テンソルを定義する主な属性は以下の通りです:
- 形状:データの次元を定義し、タプル形式(例:画像バッチの場合 $4 \times 32 \times 32$)で表現されます。
- データ型:格納されている要素の数値型を指定します(例:
torch.float32はモデルの重みに、torch.int64はインデックス操作に使用)。 - デバイス:物理的なハードウェアの場所を示します。通常は
'cpu'または'cuda'(NVIDIA GPU)です。
動的グラフと自動微分(Autograd)
PyTorchは命令型実行モデルを使用しており、演算が実行される度に計算グラフが構築されます。これにより、組み込みの自動微分エンジンであるAutogradが、テンソル上のすべての演算を追跡できるようになります。ただし、
requires_grad=Trueというプロパティが設定されている必要があります。これにより、逆伝播中における勾配の計算が容易になります。
TERMINALbash — pytorch-env
> 準備完了。実行するには「実行」をクリックしてください。
>
テンソルインスペクターライブ
コードを実行してアクティブなテンソルを確認してください
問題1
0から1の間で一様分布に従う乱数を含む $5 \times 5$ のテンソルを作成するコマンドはどれですか?
問題2
テンソル $A$ がCPU上に、テンソル $B$ がCUDAデバイス上にある場合、$A + B$ を計算しようとするとどうなりますか?
問題3
ディープラーニングにおけるモデルの重みや中間計算に最も一般的に使われるデータ型(dtype)は何ですか?
チャレンジ:テンソルの操作と形状の変更
特定の行列演算用にテンソルを準備する。
形状$(10,)$の特徴ベクトル$F$があります。これを形状$(10, 5)$の重み行列$W$で乗算する必要があります。行列積(MatMul)を行うには、$F$が2次元である必要があります。
ステップ1
$W$との乗算前に、$F$の形状はどうなるべきですか?
解答:
内側の次元が一致する必要があるため、$F$は$(1, 10)$になる必要があります。その後、$(1, 10) @ (10, 5) \rightarrow (1, 5)$となります。
コード:
内側の次元が一致する必要があるため、$F$は$(1, 10)$になる必要があります。その後、$(1, 10) @ (10, 5) \rightarrow (1, 5)$となります。
コード:
F_new = F.unsqueeze(0)またはF_new = F.view(1, -1)ステップ2
$F_{new}$と$W$(形状$(10, 5)$)の行列乗算を行います。
解答:
演算はシンプルな行列積(MatMul)です。
コード:
演算はシンプルな行列積(MatMul)です。
コード:
output = F_new @ Wまたはoutput = torch.matmul(F_new, W)ステップ3
どのメソッドを使えば、指定された次元を持つテンソルを明示的に返すことができますか?これにより、テンソルを再び$(50,)$にフラット化できますか?($F$は最初$(5, 10)$だったと仮定します。)
解答:
コード:
viewまたはreshapeメソッドを使います。フラット化する際の最も高速な方法は、-1という1次元指定を使うことです。コード:
F_flat = F.view(-1)またはF_flat = F.reshape(50)